%!TEX root = tesis-header.tex
\section{Motor de Juegos}

Un motor de juegos es un producto de software encargado de administrar los recursos que componen un videojuego, esto se logra con la definición de funciones encargadas de procesar las entradas de información tanto del jugador como del propio ambiente virtual, para lograrlo hacen uso de una cantidad enorme de recursos computacionales, que incluyen el cálculo de las reacciones de factores como la física del juego que influye en la forma de moverse y actuar sobre el ambiente; la inteligencia artificial que toma la información del entorno y la convierte en conocimiento para los personajes que decidirán las acciones que realizarán en consecuencia.

Este trabajo aborda el desarrollo de un motor de juegos especializado en juegos 3D de estrategia y acción, cada uno de estos podría abordarse de forma independiente. Para integrar estos dos géneros se propone diferenciarlos por el control del personaje y por la posición de la cámara activa.

El motor de juegos se puede ver como un sistema cuya salida es el comportamiento de los elementos que conforman el ambiente virtual. El ambiente virtual en un juego posee propiedades en las que los elementos se desenvuelven, estos elementos se pueden dividir en gráficos y no gráficos.

Un motor de juegos de acción generalmente se muestra al personaje desde atrás a una distancia determinada siguiendo al personaje. En un motor de estrategia la vista es aérea con la cámara en posición variable y el control de personajes se basa en ordenes que se dan a uno o varios miembros del equipo del jugador.

En ambos casos la inteligencia artificial tiene un papel muy importante pues en todo momento los personajes que no son controlados por el jugador deben de tomar decisiones para sobrevivir o para cumplir el objetivo del nivel específico del juego.

En este trabajo se abordará el desarrollo de este motor desde ambos enfoques, primero el de acción ya que para realizar este se necesita tener listo el modulo inteligencia artificial para los personajes no jugables, que en este caso pueden ser enemigos o aliados.



\subsection{Personajes}

Los personajes son entidades que actúan en el ambiente con comportamiento propio, el cual puede o no, recibir la influencia de parte del usuario del sistema o jugador. Los personajes serán llamados personajes controlados y autónomos dependiendo de su pueden actuar independientemente de la interacción del jugador y los que deben tomar decisiones propias sin intervención del jugador, respectivamente. A su vez, estos personajes se dividirán en personajes aliados y personajes rivales que serán descritos mas adelante.

Los personajes autónomos se verán con mayor profundidad ya que obtienen información directamente del ambiente para poder tomar decisiones por sí mismos, esta clase de personajes puede estar dentro del grupo de personajes aliados o rivales. Los personajes obtendrán la información del ambiente independientemente de la influencia del jugador, ya que las acciones del jugador pueden cambiar las condiciones del ambiente en todo momento. Los aliados o rivales actuarán entonces de manera similar pero con objetivos diferentes y en ocasiones opuestos.

\subsubsection{Personajes aliados}

El objetivo de los personajes aliados es seguir las ordenes del jugador para alcanzar un objetivo que contribuya a ganar la partida. El método para ingresar órdenes depende del modo de perspectiva que haya elegido el usuario, ya sea tercera persona o vista aérea.

En el modo de vista aérea los comandos se introducen después de seleccionar uno o varios personajes, en la interfaz gráfica de usuario se presentan las posibles acciones a realizar. Luego de que los personajes reciben las ordenes del jugador, los personajes aliados harán lo posible por cumplir la orden. Si por ejemplo el comando fue de desplazamiento de unidades y al moverse el grupo de personajes se encuentra con personajes rivales, los personajes aliados atacarán a los rivales con el fin de poder cumplir el comando pedido, ya que si son atacados no podrán alcanzar la posición requerida. Si el comando solicitado es de atacar a un personaje o grupo de personajes rivales, los personajes aliados que reciban la orden intentarán derrotar al grupo de personajes rivales a los que se les ordenó atacar, pero si están siendo derrotados y solo resta el 10 por ciento de los personajes aliados enviados al ataque, intentarán retirarse para evitar perder mas unidades.

Este modo de juego es utilizado en juegos de estrategias, sin embargo, en este tipo de juegos factores como los recursos utilizados y producidos son claves para el juego. En este proyecto de tesis no haremos énfasis en este punto ya que requeriría otro tipo de lógica por parte de los personajes tanto aliados como rivales, lo que se considera adicional al cubrir el objetivo principal que es crear un juego con perspectivas seleccionables por parte de jugador.

En el modo de vista en tercera persona, el ingreso de comandos al personaje aliado seleccionado es muy semejante a un juego de plataformas, en el cual el jugador toma el papel del personaje y las acciones que realiza, son como si se tratara del propio personaje.

La interfaz de comandos utilizada en este caso, es el ratón y en menor medida el teclado, al presionar el botón principal del ratón y arrastrar el ratón, se podrán realizar la mayor parte de las acciones, si el ratón entra al área donde esta dibujada la interfaz gráfica, el ratón se usa como en cualquier otro programa, para seleccionar las opciones disponibles, como cambiar de modo, o por ejemplo el arma que se va a utilizar al momento del ataque.

Finalmente en la perspectiva de tercera persona se podrán elegir diferentes distancias de la cámara principal, utilizando la barra espaciadora.

\subsubsection{Personajes rivales}

El objetivo de los personajes rivales es ganar la partida, ya sea derrotando al jugador o cumpliendo un objetivo determinado.

Tratar de ganar la partida significa que los personajes rivales tendrán objetivos similares que los personajes aliados, solo que para beneficio de la entidad rival que será análoga al jugador para los personajes aliados. La entidad rival, sin embargo, no tendrá que enviar ordenes a los personajes rivales como lo hace el jugador con los aliados, en este caso los personajes rivales tienen completa autonomía de acciones para poder cumplir con el objetivo final que es ganar la partida. La tarea del jugador rival es ser el representante del equipo, almacenando los puntos obtenidos de experiencia, detectando el estado del equipo del jugador con el fin de informar a los personajes rivales, y estos puedan tomar decisiones sobre ataque o defensa de su territorio o unidades.

\newpage

\subsubsection{Personajes autónomos}

Un personaje autónomo es uno que durante el curso de un juego de computadoras o animación, puede decidir como comportarse por si mismo. Para hacer un personaje autónomo, necesitamos un modelo computacional del comportamiento del personaje. Un personaje autónomo además necesita representar explícitamente un poco de conocimiento de su entorno. En el caso más simple, este conocimiento pueden ser unas pocas variables  que indiquen el estado actual del mundo del personaje.

Una alternativa mas interesante y elaborada es que el personaje pueda mantener una representación explícita de como su mundo puede cambiar. Este conocimiento de la dinámica del mundo del personaje se le llama Conocimiento de su Dominio. Para poder distinguir entre estos términos, diremos que los personajes tiene conocimiento de su dominio como personajes autónomos.

% Tablero
% Personajes
% 
% 
% Dado un cuerpo en el espacio C, se toman en cuenta los siguientes atributos:
% 
% \begin{itemize}
% \item posición
% \item vector de desplazamiento
% \end{itemize}


\subsection{Descripción de la escena}

\subsubsection{Elementos de la escena}

Los elementos de la escena son los componentes que intervienen en el desarrollo de juego, los cuales pueden ser gráficos o no gráficos. En la figura \ref{fig:escena} se pueden apreciar todos los elementos gráficos que intervienen en el videojuego, por ejemplo, se puede observar el campo de visión propuesto para los personajes así como un perímetro que es el límite espacial para poder comunicarse con personajes cercanos.

Un elemento gráfico dentro de la escena puede ser el tablero si se trata de un juego en dos dimensiones o un terreno tridimensional si se trata de uno en 3D. El tablero del juego (figura \ref{fig:escena}) a su vez aloja a los personajes que intervienen en el juego, así como los elementos propios del ambiente, este proyecto de tesis hará énfasis en los elementos activos del juego, es decir, los personajes.

Como ejemplo de elemento no gráfico se puede mencionar la física del juego. Se trata de cálculos de las fuerzas que actúan sobre los personajes y el ambiente virtual, el procesamiento de estos cálculos y la implementación de los modelos físicos sobre los elementos del juego le dan realismo al ambiente.

\begin{figure}[H]
\centering
\includegraphics[scale=.5]{img/escena.png}
\caption[escena]{Tablero de juego}
\label{fig:escena}
\end{figure}


\subsubsection{Tablero}

El tablero de este videojuego es un espacio tridimensional creado a partir de tablas de altura y mallas estáticas que son los límites en los cuales los personajes basan su movimiento, aquí adquiere importancia el control de colisiones y la visión para la demostración del funcionamiento del motor de juegos, el tablero será representado con un plano y los obstáculos con cajas o piedras que no pueden ser atravesadas por los personajes.

La manera más sencilla de crear un tablero de juegos es dividir el espacio disponible en una cuadricula definida la cual separa a los elementos del ambiente, de esta forma los personajes pueden calcular la ruta a un destino especificado dentro del tablero u obtener la información de la posición de un personaje enemigo por ejemplo.

El motor gráfico OGRE ofrece la posibilidad de usar un plano infinito con el que se calcularán las colisiones con los otros elementos gráficos. Se usará sin embargo una malla simple de dimensiones finitas para visualizar el terreno, que para este caso será un área de 100x100 unidades utilizadas por OGRE que pueden ser interpretadas como metros, centímetros o cualquier otra unidad.


\subsubsection{Datos de entrada}

Los personajes obtienen datos tanto del ambiente del juego como de otros personajes ya sean rivales o aliados. Estos datos permitirán que los personajes decidan que acción realizarán para cumplir con el objetivo.
\begin{itemize}
\item \textbf{Visión}: Intersección de objetos con el cono de visión del personaje.

\item \textbf{Comunicación}: Solicitud y envió de datos a los personajes aliados en el perímetro de comunicación, estos datos se refieren a la localización de obstáculos y enemigos, basados en su visión.
\end{itemize}
Las siguientes son propiedades de cada personaje. Estos parámetros contribuirán en la toma de decisión al tratar de conservar la mayor cantidad de energía por ejemplo.

\begin{itemize}
\item \textbf{Velocidad}: valor inicial, entre 1 y 20 (aleatorio) (valor aplicado al movimiento del personaje).

\item \textbf{Ataque}: valor inicial, entre 1 y 20 (aleatorio) (valor que se aplica al momento de ejecutar un ataque durante una pelea).

\textbf{Energía}: valor inicial, entre 1 y 20 (aleatorio) (escalar aplicado al personaje utilizado en las peleas).
\end{itemize}
De forma predeterminada se tiene una velocidad, energía y un nivel de ataque igual para todos los personajes.

Posibles acciones para un personaje. Estas acciones se aplican para ambos bandos.

\begin{itemize}
\item \textbf{Movimiento}: El personaje calculará una ruta hacía un punto del tablero

\item \textbf{Ataque}: El personaje iniciará una batalla para detener el avance del equipo rival.

\subsubsection{Batalla}
\end{itemize}

Sucede cuando se encuentran dos personajes de bandos rivales. Al aproximarse a cierta distancia inician una batalla (\ref{fig:batalla}), la cual consiste en lanzar ataques al personaje rival quitando puntos de energía aleatoriamente dependiendo de su nivel de ataque (el valor aleatorio entre 0 y 1 es multiplicado por su nivel de ataque y esa cifra es la cantidad de energía restada al personaje enemigo).

\begin{figure}[H]
\centering
\includegraphics[scale=.7]{img/batalla.png}
\caption[batalla]{Batalla entre personajes de equipos rivales}
\label{fig:batalla}
\end{figure}

\begin{figure}[H]
\centering
\includegraphics[scale=.7]{img/roles.png}
\caption[roles]{Elección de roles dentro del equipo.}
\label{fig:roles}
\end{figure}

Al iniciar la partida, los personajes reciben valores aleatorios para velocidad, energía y ataque; el valor asignado a la velocidad determina el rol del personaje, si es mayor a la velocidad del personaje con el que se está comparando, este personaje recibirá entonces el rol de atacante, de otra manera, su rol será defensor; el equipo deberá tener aproximadamente el mismo número de atacantes que defensores, favoreciendo el rol de defensor.

\begin{figure}[H]
\centering
\includegraphics[scale=.7]{img/roles2.png}
\caption[roles2]{Los miembros del equipo se comunican y eligen su rol dependiendo de sus atributos.}
\label{fig:comunicacion-roles}
\end{figure}

El proceso de elección de roles se realizará con cada personaje que se encuentre en el perímetro de comunicación, de esta forma, si su valor de velocidad es mayor que el personaje con el que se está comunicando, su rol tenderá al de atacante, pero si se encuentra con otro personaje con un valor mayor de velocidad, su rol  cambiará a defensor; inicialmente todos los miembros del equipo tienen rol de defensor, contribuyendo  esto a que los personajes se puedan comunicar (pues el rol de defensor tenderá a estar a una corta distancia del objetivo que defienden).

\begin{figure}[H]
\centering
\includegraphics[scale=.7]{img/ruta.png}
\caption[ruta]{El equipo buscará una ruta hacía el objetivo contrario}
\label{fig:ruta}
\end{figure}

El personaje debe encontrar la ruta hacía el objetivo (figura \ref{fig:ruta}), evitando obstáculos y enemigos; si encuentra a un enemigo de frente que obstaculice la ruta hacía el objetivo sin posibilidad de evitarlo, se produce una batalla (figura \ref{ruta-batalla}).

\begin{figure}[H]
\centering
\includegraphics[scale=.7]{img/ruta_batalla.png}
\caption[ruta-batalla]{Si los personajes que intentan llegar al objetivo contrario encuentran enemigos y no pueden evitarlos, se produce una batalla}
\label{fig:ruta-batalla}
\end{figure}

Defender su objetivo (figura \ref{fig:defensa-batalla}) .  Interponerse en la trayectoria del personaje rival hacía el objetivo; Iniciar una batalla con los personajes que se aproximan.

\begin{figure}[H]
\centering
\includegraphics[scale=.7]{img/defensa_batalla.png}
\caption[defensa-batalla]{Si los personajes encargados de defender el objetivo no pueden evitar que los enemigos se acerquen, inicia una batalla para defender el objetivo}
\label{fig:defensa-batalla}
\end{figure}

\subsection[Visión]{Implementación de Visión para los Personajes}

Los personajes del juego obtendrán información que recibirán del ambiente para poder tomar decisiones sobre el siguiente movimiento que harán, la visión será su principal fuente de datos sobre tablero.

La aplicación de la información obtenida del ambiente a través de la visión se discutirá mas tarde.

\subsubsection{Cono de visión}

La visión de los personajes estará limitada por dos planos perpendiculares al plano del escenario separados entre sí por un arco de entre 150 y 170 grados (figura \ref{fig:cono-vision}) con vértice atrás del personaje para dotarlo de una visión realista, la profundidad de su visión estará determinada por el ambiente, siendo como máximo el equivalente a unos 10 metros de longitud.

\begin{figure}[H]
\centering
\includegraphics[scale=.6]{img/cono.pdf}
\caption[cono-vision]{Representación del cono de visión de los personajes}
\label{fig:cono-vision}
\end{figure}


\subsubsection{Tercera Persona}

Usando esta perspectiva el jugador obtiene la identidad del personaje que esta controlando, al colocar la cámara a espaldas del personaje para que el usuario pueda observar las características y los elementos cercanos al personaje.

Un cambio en la perspectiva de visión hace que las acciones del jugador se traduzcan en comportamiento, creando la sensación de identidad sobre el personaje controlado. Esta sensación dependerá entonces de la reacción del personaje que se controle, por tanto, mientras mas reactivo sea el personaje a las acciones de jugador, la inmersión del jugador en el ambiente virtual del juego será mayor. El control directo sobre los personajes y el cambio de perspectiva son elementos que no afectan sobre el poder que tienen los personajes autónomos para tomar decisiones, por lo que las reglas de adquisición de conocimiento para generar comportamiento son las mismas en esta perspectiva que las usadas para la de vista aérea.

Controlar a un personaje en el ambiente virtual de un juego incluye introducir comandos desde los dispositivos de entrada/salida de la plataforma, que puede ser el teclado, ratón o algún control de juegos. La tendencia actual en la definición de controles de juegos es simplificarlos, las plataformas de juegos actualmente usan elementos de interacción sencillos como lápices con pantalla táctil o controles con sensores de movimiento además de los convencionales como pueden ser el teclado de computadora o ratón. La propuesta que hacemos esta basada en el uso del ratón exclusivamente, es decir, que el jugador no necesite usar el teclado de la computadora, o lo haga moderadamente.

Llamaremos a los dos tipos de control como: control en tercera persona y control de vista aérea. Cada uno tiene su propio sistema de instrucción para los personajes. El control para tercera persona funcionará como un juego común de acción/aventura, en el que se ve de espaldas al personaje controlado y un jugador controla al personaje como si se tratará de este. El control de vista aérea funciona como en un juego típico de estrategia, donde se necesita seleccionar a un personaje o grupo de personajes para darles acciones que realizar. Para los dos tipos de control, los personajes controlados interactúan con los autónomos, de forma que puedan tomar sus propias decisiones si no están recibiendo órdenes del jugador en un momento dado.

%\todo{Antes de definir los tipos de control para los personajes de deben especificar las características cognoscitivas de los personajes, es decir, el conocimiento que tienen de su ambiente y como lo obtienen para poder comportarse de forma autónoma y alcanzar sus objetivos.}

\subsection{Control de Juego} 
%\todo{Esta información podría ir en una tabla}

El control para el motor de juegos tiene características particulares para cada modalidad o perspectiva. En la perspectiva de tercera persona el elemento principal es el uso de los periférico de la plataforma. En la perspectiva aérea el elemento principal es el terreno del ambiente, aquí el jugador debe ser capaz de controlar a un equipo de personajes y apreciar el efecto de sus acciones en el terreno.

%Para que haya un juego, debe haber un jugador (interactividad) \todo{No se entiende la idea de esta lista}

%El jugador da órdenes a los personajes que intervienen en el juego.

%El modo de controlarlos depende de la perspectiva del jugador y de las acciones disponibles.

%El motor ofrece dos perspectivas para el jugador, una para controlar completamente a un personaje y otra para ordenar acciones específicas a dos o más personajes al mismo tiempo.

\subsubsection{Control en Tercera Persona}

Durante este modo de juego el jugador verá de espaldas al personaje elegido, caminando en dirección de la vista del jugador, es decir, moviéndose con la misma orientación de la cámara.

El elemento principal de control es el ratón, arrastrándolo en la dirección del movimiento y dependiendo de la distancia del cursor al personaje, la aceleración del movimiento, el botón de acción será el botón principal del ratón (izquierdo), para un desarrollo futuro se espera poder implementar gestos para el ratón.

Se podrá elegir entre varios ángulos para visualizar al personaje elegido, con la tecla espaciadora, permitiendo que el personaje elija entre dos o tres ángulos diferentes para visualizar mejor al personaje cuando así lo requiera.

Este tipo de control es el llamado de \emph{juego de acción}, donde se controla a los personajes desde un plano separado del personaje, que surgió de los juegos de plataformas donde se podía apreciar el ambiente donde el personaje se mueve.

\subsubsection{Control de Vista Aérea}

El jugador verá a los personajes desde un punto más elevado en el ambiente virtual, necesita seleccionar a los personajes que desea comandar, este modo de juego es muy parecido al que se acostumbra en la mayoría de los juegos de acción.

De nuevo el elemento de control principal es el ratón, en este caso, para poder ordenar a uno o mas personajes que ejecuten cierta acción, se deben seleccionar el botón principal del ratón encerrándolos en una caja al arrastrar y soltar el ratón sobre los personajes elegidos.

Para este modo de juego la interfaz gráfica de usuario juega un papel protagónico, ya que, el jugador elegirá de ahí los comandos disponibles para los personajes seleccionados, algunas de las opciones disponibles son: moverse (que se puede ahorrar la interfaz gráfica de usuario al dar clic con el botón secundario del ratón sobre el punto elegido como destino), atacar (el personaje o personajes seleccionados intentarán atacar el elemento o personaje del ambiente elegidos después de seleccionar este comando) y cancelar (cancela la selección del personaje o personajes).

Este tipo de control es del tipo \emph{estrategia} donde el jugador puede ver a todo su equipo aliado para dar instrucciones e intentar cumplir con el objetivo del juego.

\subsubsection{Lógica de Juego}

Se conocerá como lógica de juego a la forma en como los personajes que no están controlados por un jugador humano reaccionan ante los personajes que si lo están, así como las acciones que realizan los personajes dándoles un objetivo, el cual puede ser a favor del jugador o en contra, con lo cual se definen los personajes, aliados o rivales respectivamente.

Nuevamente este problema se puede dividir en dos partes fundamentales, la lógica correspondiente a los personajes aliados, y la lógica de los personajes rivales. Aunque en este caso se tratará del mismo algoritmo, simplemente cambiarán los objetivos definidos para cada tipo de personaje. Los personajes aliados seguirán los objetivos dados por el usuario, es decir, obedecerán  las ordenes del jugador e intentarán satisfacerlas. Los personajes Rivales, por otro lado tendrán objetivos definidos por su perfil que podrá ser creado desde la programación de la lógica o leído desde un archivo de configuración que podría estar en formato XML por ejemplo; los objetivos rivales obviamente serán contrarios a los del usuario, y principalmente intentarán hacer que el jugador pierda la partida.

\subsubsection{Reglas para Ganar una Partida}

\begin{itemize}
	\item Que el número de integrantes de cada equipo sea el mismo.
	
	\item Cada equipo se dividirá en dos grupos, uno para defender su objetivo y otro para alcanzar el objetivo del equipo enemigo.
	
	\item Los personajes no podrán atravesar obstáculos por lo que deberán encontrar una ruta para evitarlos.
	
	\item Cuando algún miembro del equipo llegue al objetivo enemigo, el juego termina.
\end{itemize}

Antes de poder definir las acciones que realiza cada tipo de personajes se debe especificar como se gana una partida, ya que los personajes aliados y rivales tienen ese objetivo final.

Los personajes rivales integran un equipo, al igual que los aliados, cada equipo tendrá un numero variable de integrantes, que tienen sus propios atributos. A continuación se listan los atributos de los personajes.

La victoria en el juego llegará cuando la totalidad de los personajes de uno de los equipos sean derrotados, o el equipo se retire del campo de batalla (tablero).
Una partida se define entonces como un periodo en el que se enfrentan los personajes rivales y aliados, esto es, de las acciones del jugador depende si se abre una partida.

Los personajes aliados y rivales son autónomos a niveles diferentes. Un personaje aliado es capaz de tomar las decisiones necesarias, basadas en las ordenes dadas por el jugador, tal que, al realizarlas se llegue al objetivo de ganar la parida. Un personaje rival, no necesita de ordenes establecidas, cada personajes rival tendrá la tarea de realizar acciones individuales y en equipo que ayuden a que su equipo (el equipo rival) alcance la victoria.
